/*
 * @Description: 用户管理模块
 * @Author: zhihong deng
 * @Date: 2021-08-21 23:40:28
 * @LastEditors: zhihong deng
 * @LastEditTime: 2021-10-05 23:50:58
 */
const router = require('koa-router')()
const User = require('../models/userSchema')
const Counter = require('../models/counterSchema')
const Menu = require('../models/menuSchema')
const Role = require('../models/roleSchema')
const util = require('../utils/util')
const jwt = require('jsonwebtoken')
const md5 = require('md5')
router.prefix('/users')

// 登录接口
router.post('/login', async (ctx) => {
	try {
		const { userName, userPwd } = ctx.request.body
		const res = await User.findOne(
			{
				userName,
				userPwd: md5(userPwd),
			},
			'userId userName userEmail state role deptId roleList'
		)

		const data = res._doc
		console.log('获取登录的data:', data)
		// token签名
		const token = jwt.sign(
			{
				data,
			},
			'gino',
			{ expiresIn: '1h' }
		)

		if (res) {
			data.token = token
			ctx.body = util.success(data)
		} else {
			ctx.body = util.fail('账号或密码不正确')
		}
	} catch (error) {
		ctx.body = util.fail(error.msg)
	}
})
// 用户列表接口
router.get('/list', async (ctx) => {
	const { userId, userName, state } = ctx.request.query
	const { page, skipIndex } = util.pager(ctx.request.query)
	let params = {}
	if (userId) params.userId = userId
	if (userName) params.userName = userName
	if (state && state != '0') params.state = state
	try {
		// 根据条件查询所有用户列表
		const query = User.find(params, { _id: 0, userPwd: 0 })
		const list = await query.skip(skipIndex).limit(page.pageSize)
		const total = await User.countDocuments(params)

		ctx.body = util.success({
			page: {
				...page,
				total,
			},
			list,
		})
	} catch (error) {
		ctx.body = util.fail(`查询异常:${error.stack}`)
	}
})
// 删除用户/批量删除
router.post('/delete', async (ctx) => {
	// 待删除的用户Id数组
	const { userIds } = ctx.request.body
	const res = await User.updateMany(
		{ userId: { $in: userIds } },
		{ state: 2 }
	)
	if (res.nModified) {
		ctx.body = util.success(res, `共删除成功${res.nModified}条`)
		return
	}
	ctx.body = util.fail('删除失败')
})
// 用户新增/编辑
router.post('/operate', async (ctx) => {
	const {
		userId,
		userName,
		userEmail,
		mobile,
		job,
		state,
		roleList,
		deptId,
		action,
	} = ctx.request.body
	if (action == 'add') {
		if (!userName || !userEmail || !deptId) {
			ctx.body = util.fail('参数错误', util.CODE.PARAM_ERROR)
			return
		}
		const res = await User.findOne(
			{ $or: [{ userName }, { userEmail }] },
			'_id userName userEmail'
		)
		if (res) {
			ctx.body = util.fail(
				`系统监测到右重复的用户，信息如下：${res.userName} - ${res.userEmail}`
			)
		} else {
			// 更新uerId,$inc加1,{new: true}返回一个新表格
			const doc = await Counter.findOneAndUpdate(
				{ _id: 'userId' },
				{ $inc: { sequence_value: 1 } },
				{ new: true }
			)
			try {
				const user = new User({
					userId: doc.sequence_value,
					userName,
					userPwd: md5('123456'), // 密码默认为123456
					userEmail,
					role: 1, // 默认为普通用户
					mobile,
					job,
					state,
					roleList,
					deptId,
				})
				user.save()
				ctx.body = util.success('', '用户创建成功')
			} catch (error) {
				ctx.body = util.fail(error, '用户创建失败')
			}
		}
	} else {
		if (!deptId) {
			ctx.body = util.fail('部门不能为空', util.CODE.PARAM_ERROR)
			return
		}
		try {
			const res = await User.findOneAndUpdate(
				{ userId },
				{ mobile, job, state, roleList, deptId }
			)
			ctx.body = util.success({}, '更新成功')
		} catch (error) {
			ctx.body = util.fail(error.stack, '更新失败')
		}
	}
})
// 获取全部用户列表
router.get('/all/list', async (ctx) => {
  try {
    const list = await User.find({}, "userId userName userEmail")
    ctx.body = util.success(list)
  } catch (error) {
    ctx.body = util.fail(error.stack)
  }
})
// 获取用户对应的权限菜单
router.get('/getPermissionList', async (ctx) => {
  let authorization = ctx.request.headers.authorization
  let {data} = util.decoded(authorization)
  let menuList = await getMenuList(data.role, data.roleList)
  let actionList = getActionList(JSON.parse(JSON.stringify(menuList)))
  ctx.body = util.success({menuList, actionList})
})
async function getMenuList (userRole, roleKeys) {
  let rootList = []
  if (userRole == 0) {
    rootList = await Menu.find({}) || []
  } else {
    // 根据用户拥有的角色，获取权限列表
    // 在查找用户对应的角色有哪些
    let roleList = await Role.find({_id: {$in :roleKeys}})
    let permissionList = []
    // 遍历出权限有哪些，再去掉重复的权限
    roleList.map(role => {
      let {checkedKeys, halfCheckedKeys} = role.permissionList
      permissionList = permissionList.concat([...checkedKeys, ...halfCheckedKeys])
    })
    // ES6去重
    permissionList = [...new Set(permissionList)]
    rootList = await Menu.find({_id: {$in: permissionList}})
  }
  return util.getTreeMenu(rootList, null, [])
}
function getActionList (list) {
  const actionList = []
  const deep = (arr) => {
    while (arr.length) {
      let item = arr.pop();
      if (item.action) {
        item.action.map(action => {
          actionList.push(action.menuCode)
        })
      }
      if (item.children && !item.action) {
        deep(item.children);
      }
    }
  };
  deep(list)
  return actionList
}
module.exports = router
